/*
 * @Author: xuetao 3168581151@qq.com
 * @Date: 2025-01-28
 * @LastEditors: xuetao 3168581151@qq.com
 * @LastEditTime: 2025-02-08
 * @Description: hive数据库 持久化服务，单例模式
 */
import 'package:flutter/foundation.dart'; // kIsWeb
import 'package:path_provider/path_provider.dart';

import 'package:hive_flutter/hive_flutter.dart';

import 'package:chat_client/models/apply.dart'; // 申请
import 'package:chat_client/models/contact.dart'; //联系人
import 'package:chat_client/models/group.dart'; //联系人
import 'package:chat_client/models/conversation.dart'; //聊天列表

class HiveService {
  // 私有构造函数
  HiveService._internal();

  // 静态实例，确保只有一个实例
  static final HiveService _instance = HiveService._internal();

  // 公共访问点
  static HiveService get instance => _instance;

  // 初始化 Hive
  static Future<void> initHive() async {
    if (kIsWeb) {
      await Hive.initFlutter();
    } else {
      final appDocumentDir = await getApplicationDocumentsDirectory();
      await Hive.initFlutter(appDocumentDir.path);
    }

    // 注册适配器
    Hive.registerAdapter(GroupAdapter());
    Hive.registerAdapter(MemberAdapter());
    Hive.registerAdapter(ConversationAdapter());
    Hive.registerAdapter(MessageAdapter());
    Hive.registerAdapter(ContactAdapter());
    Hive.registerAdapter(ApplyAdapter());
  }

  // 打开或创建盒子
  Future<Box> openBox(String boxName) async {
    switch (boxName) {
      case 'groupBox':
        return await Hive.openBox<Group>('group');
      case 'groupMemberBox':
        return await Hive.openBox<Group>('groupMember');
      case 'contactBox':
        return await Hive.openBox<Contact>('contact');
      case 'applyBox':
        return await Hive.openBox<Apply>('apply');
      case 'conversationBox':
        return await Hive.openBox<Conversation>('conversation');
      default:
        throw Exception('Box not found: $boxName');
    }
  }

  // 创建/更新数据
  Future<void> createOrUpdate(Box box, String key, dynamic value) async {
    await box.put(key, value);
  }

  // 删除数据
  Future<void> deleteItem<T>(Box<T> box, String key) async {
    await box.delete(key);
  }

  // 获取单个数据
  T? getItem<T>(Box<T> box, String key, {T? defaultValue}) {
    return box.get(key, defaultValue: defaultValue);
  }

  // 获取所有数据
  List<T> getAllItems<T>(Box<T> box) {
    return box.values.toList();
  }

  // 清空 Box
  Future<void> clearBox<T>(Box<T> box) async {
    await box.clear();
  }

  // 获取 Box 中的数据条数
  int getBoxLength<T>(Box<T> box) {
    return box.length;
  }

  // 关闭所有 Box
  Future<void> closeAllBoxes() async {
    await Hive.close();
  }

  // 关闭单个Box
  Future<void> closeBoxe(Box box) async {
    await box.close();
  }
}
